Polychromatic LGS

A multi-level sodium system excited by 330 nm light
from pylgs.all import *

Define a LGS system pumped by 330 nm light:

lgs = LGSSystem(
    'Na330', 
    {
        'IntensitySI1': 5000.,
        'BFieldG': 0.5,
        'EllipticityDegrees1': 45.,
        'PolarizationAngleDegrees1': 0,
        'DetuningHz1': 1.0832e9,
        'LaserWidthHz1': 10.0e6,
        'MagneticZenithDegrees': 45.,
        'MagneticAzimuthDegrees': 45.,
        'SDampingCollisionRatePerS': 4081.63,
        'BeamTransitRatePerS': 131.944,
        'VccRatePerS': 28571.,
        'TemperatureK': 185.,
        'RecoilParameter': 1.
    }
)

The system is made up of 774 density-matrix elements describing 7 atomic levels:

lgs.level_population.range
{Level(7) ⨉ Density matrix (source)(774)}
HTML(', '.join(lgs.level_population.range.coords['Level'].data))
3D5/2, 3S1/2, 3P1/2, 4P3/2, 4S1/2, 3D3/2, 3P3/2

Steady-state model

Adaptively refine velocity groups

Build a steady-state model with adaptively refined velocity groups:

model = lgs.adaptive_stationary_model({}, max_weight=0.02)

Solve for the density matrix. There are 77 velocity groups in the model:

sol = model.solve()
sol
{Atomic velocity(77) ⨉ Density matrix (source)(774), }

Plot the total return flux for each transition as a bar chart:

model.total_flux(sol).visualize()

Plot the flux as a function of velocity:

model.flux_distribution(sol).visualize(xaxis_range=(-1, 2))

Transient dynamics model

Build a model for the transient dynamics:

model = lgs.instationary_model(
    vg=model.data['velocity_groups'], 
    T=1e-6, 
    num_values=101
)

Set tolerances for the BDF solver:

pymor.basic.set_defaults({
    'pylgs.pymor.timestepping.cvode_solver_options.cvode_bdf_atol': 1e-6,
    'pylgs.pymor.timestepping.cvode_solver_options.cvode_bdf_rtol': 1e-5,
})

Solve for the density matrix as a function of time:

sol = model.solve()

Plot the return flux for each transition:

model.total_flux(sol).visualize()

Animate the level population distribution as a function of time:

model.level_population_distribution(sol).visualize(xaxis_range=(-.25, 2), yaxis_range=(0, .045))
lgs.Flux
Flux{DM(774)} → {Tr(11)}